/*
 * Copyright 2011 www.pretty-tools.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#include "stdafx.h"
#include "resource.h"
#include "WebSlideShowExtension_i.h"
#include "dllmain.h"

/////////////////////////////////////////////////////////////////////////////
// User-Agent

LPCTSTR pszUserAgentPath = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\5.0\\User Agent\\Post Platform");

void UnRegisterUserAgent()
{
	RegKey key;
	if (!key.CreateEx(HKEY_LOCAL_MACHINE, pszUserAgentPath, NULL, REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE))
		return;

	ATLTRACE( _T("Search for User Agents:\n") );
	LONG lResult = ERROR_SUCCESS;
	for(DWORD dwIndex = 0; ERROR_SUCCESS == lResult; ++dwIndex)
	{
		TCHAR szValueName[2048];
		DWORD dwValueNameSize = sizeof(szValueName);

		lResult = key.EnumValue(dwIndex, szValueName, &dwValueNameSize, NULL, NULL, NULL);

		if (ERROR_SUCCESS != lResult)
			continue;

		if (_tcsncmp(szValueName, _T("WebSlideShow "), 13))
			continue;

		ATLTRACE("Remove old User Agent Value", szValueName);
		key.DeleteValue(szValueName), --dwIndex;
	}
}

void RegisterUserAgent()
{
    UnRegisterUserAgent();

	RegKey key;
	if (key.CreateEx(HKEY_LOCAL_MACHINE, pszUserAgentPath, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE))
        key.SetValue((CString) + _T("WebSlideShow ") + UTIL::GetVersion(), CString());
}

/////////////////////////////////////////////////////////////////////////////

// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
    return _AtlModule.DllCanUnloadNow();
}


// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}


// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
    // registers object, typelib and all interfaces in typelib
    HRESULT hr = _AtlModule.DllRegisterServer();
    if (SUCCEEDED(hr)) RegisterUserAgent();
	return hr;
}


// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
	_AtlModule.DllUnregisterServer();

    UnRegisterUserAgent();

    return S_OK;
}

// DllInstall - Adds/Removes entries to the system registry per user
//              per machine.	
STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine)
{
    HRESULT hr = E_FAIL;
    static const wchar_t szUserSwitch[] = _T("user");

    if (pszCmdLine != NULL)
    {
    	if (_wcsnicmp(pszCmdLine, szUserSwitch, _countof(szUserSwitch)) == 0)
    	{
    		AtlSetPerUserRegistration(true);
    	}
    }

    if (bInstall)
    {	
    	hr = DllRegisterServer();
    	if (FAILED(hr))
    	{	
    		DllUnregisterServer();
    	}
    }
    else
    {
    	hr = DllUnregisterServer();
    }

    return hr;
}
